package trainee.compra.dao;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import trainee.compra.to.CarroTO;
import trainee.compra.utilitarios.ExcepcionConexion;

public class CarroDAO {
    private EntityManager entityManager;

    public CarroDAO() {

    }

    /**
     * Se contruye el objeto entregandole el Entity Manager para poder
     * realizar las consoltas a la base de datos
     * 
     * @param entityManager
     */
    public CarroDAO(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    /**
     * crear un nuevo carro pendiente en la base de datos
     * 
     * @param nombreUsuario
     *            usuario al cual se asociara el nuevo carro
     */
    public void crearCarroPendiente(String nombreUsuario)
            throws ExcepcionConexion {
        try {
            CarroTO carro = new CarroTO();
            carro.setNombreUsuario(nombreUsuario);
            carro.setCompraFinalizada(0);
            entityManager.persist(carro);
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * entrega desde la base de datos el id del carro que se encuentra sin
     * comprar
     * 
     * @param nombreUsuario
     *            nombre del usuario a buscar
     * @return
     */
    public int obtenerIdCarroPendiente(String nombreUsuario)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("select c from CarroTO c where c.compraFinalizada=:p and c.nombreUsuario = :u");
            query.setParameter("p", 0);
            query.setParameter("u", nombreUsuario);
            List<CarroTO> listResultado = query.getResultList();
            if (listResultado.size() > 0) {
                return listResultado.get(0).getIdCarro();
            } else {
                return 0;
            }
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

    /**
     * Modifica el campo "compraFinalizada" y ingresa "fechaFinalizada" para
     * dar por comprado el carrito pendiente
     * 
     * @param nombreUsuario
     *            nombre del carrito a comprar
     * @param fecha
     *            fecha actual de la compra del carrito
     */
    public void comprarCarro(String nombreUsuario, Date fecha)
            throws ExcepcionConexion {
        try {
            Query query =
                    entityManager
                            .createQuery("update CarroTO c SET c.compraFinalizada = 1, c.fechaCompra = :f where c.nombreUsuario = :u and c.compraFinalizada=0");
            query.setParameter("u", nombreUsuario).setParameter("f", fecha)
                    .executeUpdate();
        } catch (Exception e) {
            throw new ExcepcionConexion(
                    "Error al conectar a la base de datos. Comuniquese con el administrador");
        }
    }

}
